﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

/*文件操作*/


//int main()
//{
//	int a = 10000;
//	FILE* pf = fopen("test.txt", "wb");
//	fwrite(&a, 4, 1, pf);//以二进制形式写到文件中"wb"
//	pf = NULL;
//	return 0;
//}
//顺序读写:
//函数名   功能                               适⽤于
//fgetc   字符输⼊函数,从流里读数据(字符)          所有输⼊流
//fputc   字符输出函数,向流里写数据(字符)          所有输出流
//fgets   ⽂本⾏输⼊函数                          所有输⼊流
//fputs   ⽂本⾏输出函数                          所有输出流
//fscanf  格式化输⼊函数                          所有输⼊流
//fprintf 格式化输出函数                          所有输出流
//fread   ⼆进制输⼊    ⽂件
//fwrite  ⼆进制输出    ⽂件

//int main()
//{
//	//打开文件,打开失败会返回NULL;
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	for (int i = 0; i < 26; i++)
//	{
//		fputc('a' + i, pf);//26个字母写进文件
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	int i = 0;
//	for (i = 0; i < 26; i++)
//	{
//		fputc('a' + i, stdout);//输出到屏幕上
//		fputc(' ', stdout);
//	}
//	return 0;
//}

//int main()
//{
//	//打开文件,打开失败会返回NULL;
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	int ch = 0;
//	while ((ch = fgetc(pf))!= EOF)
//	{
//		printf("%c", ch);
//	}
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


/*
	完成:将data1.txt文件内容拷贝一份,生成data2.txt
*/
/***************************************/
//int main()
//{
//	FILE* pf1 = fopen("data1.txt", "r");
//	if (pf1 == NULL)
//	{
//		perror("data1.txt->fopen");
//		return 1;
//	}
//
//	FILE* pf2 = fopen("data2.txt", "w");
//	if (pf2 == NULL)
//	{
//		fclose(pf1);//如果第二个文件打开失败,就把第一个文件关掉
//		perror("data2.txt->fopen");
//		return 1;
//	}
//	//数据的读写和拷贝
//	int ch = 0;
//	while ((ch = fgetc(pf1)) != EOF)
//	{
//		fputc(ch, pf2);
//	}
//
//	//关闭文件
//	fclose(pf1);
//	fclose(pf2);
//	return 0;
//}
/***************************************/

//int main()
//{
//	//打开文件,打开失败会返回NULL;
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件fputs，int fputs( const char *string, FILE *stream );
//	fputs("abcdef\n", pf);
//	fputs("abcdef\n", pf);
//	fputs("abcdef\n", pf);
//	fputs("abcdef\n", pf);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//打开文件,打开失败会返回NULL;
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	char arr[20] = "xxxxxxxxxxxxxxxxxx";
//	//读文件fgets,
//	//char *fgets( char *string, int n, FILE *stream );
//	//从stream中读取n个数据，放在string中
//	fgets(arr, 10, pf);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//

//struct Stu
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct Stu s = { "zhangsan",20,90.5f };
//	//打开文件,打开失败会返回NULL;
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	
//	fprintf(pf, "%s %d %f", s.name, s.age, s.score);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//struct Stu
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct Stu s = { 0 };
//	//打开文件,打开失败会返回NULL;
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	
//	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));
//	fprintf(stdout, "%s %d %.1f", s.name, s.age, s.score);
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//struct stu
//{
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	struct stu s = { "zhangsna",20,90.5 };
//	//打开文件,打开失败会返回null;
//	FILE* pf = fopen("data.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//写文件
//	//size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );二进制的形式写进去
//	//buffer指向被写的数据元素的起始位置
//	//size被写的每个元素的大小
//	//count写几个元素
//	//stream流
//	fwrite(&s, sizeof(s), 1, pf);
//
//
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

struct stu
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct stu s = { 0 };
	//打开文件,打开失败会返回null;
	FILE* pf = fopen("data.txt", "rb");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	//size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );二进制的形式写进去
	//buffer指向被写的数据元素的起始位置
	//size被写的每个元素的大小
	//count写几个元素
	//stream流
	fread(&s, sizeof(s), 1, pf);
	printf("%s %d %.1f", s.name, s.age, s.score);

	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}